<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
<script>
  // TODO: this应用场景
  // 作为普通函数
  // 使用call apply bind
  // 作为对象方法被调用
  // 在class方法中调用
  // 箭头函数

  // TODO: this取什么值, 是在函数执行的时候确认的, 不是定义的时候确认
  // this就是函数的调用者
  function fn1() {
    console.log(this);
  }
  fn1(); // window
  fn1.call({ x: 100 }); // { x: 100 }
  const fn2 = fn1.bind({ x: 200 }); // bind会返回一个新的函数
  fn2(); // { x: 200 }

  const zhangsan = {
    name: '张三',
    sayHi(){
      // 即当前对象
      console.log(this);
    },
    wait() {
      setTimeout(function() {
        // window
        console.log(this);
      });
    },
    waitAgain() {
      setTimeout(() => {
        // 箭头函数 this 取决于上级作用域
        console.log(this);
      });
    }
  }

  class People {
    constructor(name) {
      this.name = name;
      this.age = 20;
    }
    sayHi() {
      console.log(this);
    }
  }
  const p = new People('p1');
  p.sayHi();
</script>
</body>
</html>